//package cn.iocoder.yudao.module.voice.fs;
//
//import cn.iocoder.yudao.module.core.util.SnowflakeIdWorker;
//import cn.iocoder.yudao.module.voice.fs.cc.cache.CacheService;
//import cn.iocoder.yudao.module.voice.fs.cc.command.GroupHandler;
//import cn.iocoder.yudao.module.voice.fs.cc.fs.FsListen;
//import cn.iocoder.yudao.module.voice.fs.cc.tcp.TcpServer;
//import cn.iocoder.yudao.module.voice.fs.cc.websocket.WebSocketManager;
//import cn.iocoder.yudao.module.voice.fs.cc.websocket.handler.WsMonitorHandler;
//import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
//import io.minio.MinioClient;
//import io.netty.util.HashedWheelTimer;
//import org.mybatis.spring.annotation.MapperScan;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.CommandLineRunner;
//import org.springframework.boot.SpringApplication;
//import org.springframework.boot.autoconfigure.SpringBootApplication;
//import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//import org.springframework.cloud.client.loadbalancer.LoadBalanced;
//import org.springframework.context.ApplicationListener;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.event.ContextClosedEvent;
//import org.springframework.http.client.SimpleClientHttpRequestFactory;
//import org.springframework.web.client.RestTemplate;
//
//import java.util.concurrent.TimeUnit;
//
//
//@EnableDiscoveryClient
//@EnableEncryptableProperties
//@MapperScan("cn.iocoder.yudao.module.core.mapper")
//@SpringBootApplication
//public class FsApiApplication implements CommandLineRunner, ApplicationListener<ContextClosedEvent> {
//    private Logger logger = LoggerFactory.getLogger(FsApiApplication.class);
//
//    @Autowired
//    private WebSocketManager webSocketManager;
//
//    @Autowired
//    private TcpServer tcpServer;
//
//    @Autowired
//    private FsListen fsListen;
//
//    @Autowired
//    private GroupHandler groupHandler;
//
//    @Autowired
//    private WsMonitorHandler wsMonitorHandler;
//
//    @Autowired
//    private CacheService cacheService;
//
//
//    @Value("${subscribe.agent.state:false}")
//    private Boolean agentState;
//
//
//    /**
//     * 外部调用服务
//     *
//     * @param connectTimeout
//     * @param readTimeout
//     * @return
//     */
//    @Bean
//    public RestTemplate restTemplate(@Value("${cdr.notify.connectTimeout:100}") Integer connectTimeout, @Value("${cdr.notify.readTimeout:300}") Integer readTimeout) {
//        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
//        simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout);
//        simpleClientHttpRequestFactory.setReadTimeout(readTimeout);
//        return new RestTemplate(simpleClientHttpRequestFactory);
//    }
//
//    /**
//     * 内部调用服务
//     *
//     * @param connectTimeout
//     * @param readTimeout
//     * @return
//     */
//    @LoadBalanced
//    @Bean
//    public RestTemplate httpClient(@Value("${cc.inner.connectTimeout:100}") Integer connectTimeout, @Value("${cc.inner.readTimeout:3000}") Integer readTimeout) {
//        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
//        simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout);
//        simpleClientHttpRequestFactory.setReadTimeout(readTimeout);
//        return new RestTemplate(simpleClientHttpRequestFactory);
//    }
//
//
//    @Bean
//    public MinioClient minioClient(@Value("${minio.endpoint:}") String endpoint, @Value("${minio.access.key:}") String accessKey, @Value("${minio.secret.key:}") String secretKey) {
//        try {
//            return new MinioClient.Builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
//        } catch (Exception e) {
//            logger.error(e.getMessage(), e);
//        }
//        return null;
//    }
//
//    @Bean
//    public SnowflakeIdWorker snowflakeIdWorker() {
//        return new SnowflakeIdWorker(0, 0);
//    }
//
//    @Bean
//    public HashedWheelTimer hashedWheelTimer() {
//        return new HashedWheelTimer(100, TimeUnit.MILLISECONDS, 10240);
//    }
//
//
//    public static void main(String[] args) {
//        SpringApplication.run(FsApiApplication.class, args);
//    }
//
//    @Override
//    public void run(String... args) throws Exception {
//        cacheService.initCompany();
//        webSocketManager.start();
//        fsListen.start();
//        groupHandler.start();
//        wsMonitorHandler.start();
//
//        //开启tcp订阅坐席状态
//        if (agentState) {
//            tcpServer.start();
//        }
//    }
//
//
//    @Override
//    public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
//        cacheService.stop();
//        webSocketManager.stop();
//        fsListen.stop();
//        groupHandler.stop();
//        wsMonitorHandler.stop();
//        tcpServer.stop();
//    }
//}
